package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.ShoppingCart;
import com.itheima.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author ：石破天
 * @date ：Created in 2022年12月26日
 * @description ：
 * @version: 1.0
 */
@Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController {

    @Autowired
    private ShoppingCartService shoppingCartService;

    @PostMapping("/add")
    public R<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart){
        log.info("添加到购物车中的购物项:"+shoppingCart);
       // 目标 shoppingCart 数据补全 存到数据库中
        // 1:购物项少 登录人id id在呢呢 session域中
        // 啥时候存的  登录时候存的  可以从session取 没毛病
        // 过滤器在做登录权限校验的时候，把用户id放到了线程中。
        // 还可以从当前线程中取出
        Long userId = BaseContext.getCurrentId();
        //存进去
        shoppingCart.setUserId(userId);
        //2: 这个购物项 用户点了几份？
        /*
          去数据库查，如果数据库没有，这是第一份。
                          数据库添加数据
                    如果数据库有，在原有的份数上+1。
                         数据库进行更新份数
         */
        // 怎么查询该用户有没有添加过 该套餐/菜品呢？
// select * from  shopping_cart where user_id=? and dish_id=?
// select * from  shopping_cart where user_id=? and setmeal_id=?
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,userId);// select * from  shopping_cart where user_id=?
        //shoppingCart 添加购物项数据
        if(shoppingCart.getDishId()!=null){ //添加的菜品
            wrapper.eq(ShoppingCart::getDishId,shoppingCart.getDishId());
        }else{//添加的套餐
            wrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
        }
        // select * from  shopping_cart where user_id=? and dish_id=?
        // select * from  shopping_cart where user_id=? and setmeal_id=?
       // 查询  上面两个sql其中一个
        ShoppingCart one = shoppingCartService.getOne(wrapper);
        // one 就是 从数据库查出来 购物项（菜品or套餐）数据
        if(one==null){//说明没有 需要添加 份数是1
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            //完成添加
            shoppingCartService.save(shoppingCart);
          //  return R.success(shoppingCart);//返回添加到数据库的数据
        }else{
           // one 查出来的 购物项 原来的信息
            // 需要更新数量
            one.setNumber(one.getNumber()+1);
            // 更新
            shoppingCartService.updateById(one);
           // return R.success(one);//返回 更新到数据库的数据
            shoppingCart=one;
        }
        return R.success(shoppingCart);

    }


    /**
     * 查询 某个用户所有的购物项信息 在页面进行展示
     */
    @GetMapping("/list")
    public R<List> list(){
        log.info("查询当前用户的 购物项信息！！");
        // 当前用户指的是 谁登录是谁
        Long userId = BaseContext.getCurrentId();

        // 怎么查询该用户的购物项
        // select * from shopping_cart where user_id = ?
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,userId);

        List<ShoppingCart> list = shoppingCartService.list(wrapper);

        return R.success(list);
    }

    /**
     *  清空指定用户的购物项
     */
    @DeleteMapping("/clean")
    public R<String> clean(){
        log.info("清空用户的所有购物项");
        // 当前用户指的是 谁登录是谁
        Long userId = BaseContext.getCurrentId();

        // delete from shoppingCart where user_id=?
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,userId);

        shoppingCartService.remove(wrapper);

        return R.success("清空成功");
    }
    /**
     * 购物项减一 功能
     *   返回的就是 购物项减少后的状态
     */
    @PostMapping("/sub")
    public R<ShoppingCart> sub(@RequestBody ShoppingCart shoppingCart){
        log.info("需要更新的购物项（可能是菜品可能是套餐）:"+shoppingCart);
        /*
           去数据库 根据 菜品id/套餐id 查询指定用户 的购物项信息
         */
        Long userId = BaseContext.getCurrentId();
        //2: 这个购物项 用户点了几份？
        /*
          去数据库查，查询当前购物项，更新份数  份数-1
            检查更新后的份数
               如果是 0  说明没了，数据库要进行删除。
               如果不是0, 把最新的购物项数据更新到数据库
         */
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,userId);// select * from  shopping_cart where user_id=?
        //shoppingCart 添加购物项数据
        if(shoppingCart.getDishId()!=null){ //添加的菜品
            wrapper.eq(ShoppingCart::getDishId,shoppingCart.getDishId());
        }else{//添加的套餐
            wrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
        }
        // select * from  shopping_cart where user_id=? and dish_id=?
        // select * from  shopping_cart where user_id=? and setmeal_id=?
        // 查询  上面两个sql其中一个
        ShoppingCart one = shoppingCartService.getOne(wrapper);
        // 先做了更新 份数  份数-1
        one.setNumber(one.getNumber()-1);

        if(one.getNumber()==0){//没了 删除
            // 根据条件删 delete from  shopping_cart where user_id=? and dish_id=?
            //    delete  from  shopping_cart where user_id=? and setmeal_id=?
            shoppingCartService.remove(wrapper);

        }else{ // 还有 更新
            shoppingCartService.updateById(one);
        }

        return R.success(one);
    }
}
